package main

import (
	"fmt"
)

// 学生信息保存到学生管理系统中
// 定义一个student的结构体
type student struct {
	id    int
	name  string
	class string
}

// 构造学生函数  返回结构体指针(节省内存)
func newStudent(id int, name, class string) *student {
	return &student{
		id:    id,
		name:  name,
		class: class,
	}
}

// 定义学生管理的结构体类型,将学生信息保存在一个student指针类型的切片中
type studentManager struct {
	allstudent []*student
}

// 构造学生列表管理函数，用列表来保存
func newstudnetmanager() *studentManager {
	return &studentManager{
		allstudent: make([]*student, 0, 100), //使用key-value初始化
	}
}

// 添加学生信息
// 指针类型接收者 s *studentManager
// newstu *student   定义一个名为newstu的指针类型形参
func (s *studentManager) addStudent(newstu *student) {
	s.allstudent = append(s.allstudent, newstu)
	fmt.Println("添加完成")
}

// 修改学生信息
func (s *studentManager) changeStudent(newstu *student) {
	// 因为学号是唯一的,因此采用for循环来判断id是否存在,
	for i, v := range s.allstudent {
		if newstu.id == v.id { //如果和学生管理系统中的id相同,则将新学生的信息存入到切片中
			s.allstudent[i] = newstu //根据切片索引直接把新学生赋值进来
			fmt.Println("学生信息修改完成")
			return
		}
		// 当学生不存在时,直接返回不存在信息
		fmt.Println("系统中没有该学号", newstu.id)
	}
}

// 展示学生信息
func (s *studentManager) showStudent() {
	for _, v := range s.allstudent {
		fmt.Printf("学号:%d 姓名: %s 班级: %s\n", v.id, v.name, v.class)
	}
}

// // // 删除学生信息
func (s *studentManager) deletestudent(newstu *student) {
	for i, v := range s.allstudent {
		if v.id == newstu.id {
			s.allstudent = append(s.allstudent[:i], s.allstudent[i+1:]...)
			fmt.Println("删除完成")
			return
		}
	}
}
